package gui;

import java.awt.EventQueue;
import java.io.File;
import java.io.StringReader;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import exceptions.IllegalContextException;
import visitor.EvaluationVisitor;
import visitor.PostfixVisitor;
import visitor.SimmetricVisitor;
import visitor.Visitor;
import Builder.RecursiveExpressionBuilder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;

public class MainFrame extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 3783223657497750606L;
	//-----------LOGICA---------------------------
	private String combinazione;
	private String pathProperty;
	private StringReader reader;
	private RecursiveExpressionBuilder builder;
	private Visitor visitor;
	//-----------GRAFICA--------------------------
	private JPanel contentPane;
	private JTextField textField;
	private JLabel lblPrincipale;
	private JButton btnValuta;
	private JButton btnInfo;
	private JButton btnCaricaProperty;
	private JRadioButton rdbtnVisitaSimmetrica;
	private JRadioButton rdbtnVisitaPostfissa;
	private ButtonGroup group;
	private JTextPane txtpnRisultato;
	

	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 640, 480);
		
		
		
		group = new ButtonGroup();
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(null);
		setContentPane(contentPane);
		contentPane.add(getTextField());
		contentPane.add(getLblPrincipale());
		contentPane.add(getBtnValuta());
		contentPane.add(getBtnInfo());
		contentPane.add(getBtnCaricaProperty());
		contentPane.add(getRdbtnVisitaSimmetrica());
		contentPane.add(getRdbtnVisitaPostfissa());
		contentPane.add(getTxtpnRisultato());
	}
	private JTextField getTextField() {
		if (textField == null) {
			textField = new JTextField();
			textField.setBounds(23, 55, 587, 28);
			textField.setColumns(10);
		}
		return textField;
	}
	private JLabel getLblPrincipale() {
		if (lblPrincipale == null) {
			lblPrincipale = new JLabel("Inserire Espressione da valutare. Ogni simbolo deve essere seguito da uno spazio :");
			lblPrincipale.setBounds(23, 27, 587, 16);
		}
		return lblPrincipale;
	}
	private JButton getBtnValuta() {
		if (btnValuta == null) {
			btnValuta = new JButton("valuta");
			btnValuta.setEnabled(false);
			btnValuta.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if(pathProperty==null){
						JOptionPane.showMessageDialog(btnValuta, "Selezionare prima il file di property.");
						
					}//if
					else{
						getTxtpnRisultato().setText("");
						combinazione = getTextField().getText();
						if(combinazione.equals("")){
							System.out.println("Espressione vuota");
							JOptionPane.showMessageDialog(btnValuta, "Inserire l'espressione");

						} //arrivati qui dovrebbe essere tutto apposto 
				        reader = new StringReader(combinazione); 
						builder = new RecursiveExpressionBuilder(reader); //inizializzo il reader
				        try {
							builder.getCond().toAssess(pathProperty); //comincio ad analizzare il tutto 
							
						} catch (IllegalContextException e1) {
							// TODO Auto-generated catch block
							JOptionPane.showMessageDialog(btnValuta, "Problemi con il builder");

						}
				        EvaluationVisitor ev = new EvaluationVisitor();
				        builder.getCond().accept(ev);
				        builder.getCond().accept(visitor);

				        StringBuilder sb = new StringBuilder();
				        sb.append("--------ESPRESSIONE-----------\n");
				        sb.append(builder.getCond()+"\n");
				        sb.append("--------RISULTATO-----------\n");
				        sb.append(ev.getResult()+"\n");
				        sb.append("--------VISITOR-----------\n");
				        sb.append(visitor.toString()+"\n");
				        
						getTxtpnRisultato().setText(sb.toString());
					}//else
				}
			});//actionperformed
			btnValuta.setBounds(23, 95, 117, 29);
		}
		return btnValuta;
	}
	private JButton getBtnInfo() {
		if (btnInfo == null) {
			btnInfo = new JButton("?");
			btnInfo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					InfoFrame info = new InfoFrame();
					info.setVisible(true);
				}
			});//fine azione
			btnInfo.setBounds(564, 95, 33, 29);
		}//if
		return btnInfo;
	}//fine infobottone
	
	
	private JButton getBtnCaricaProperty() {
		if (btnCaricaProperty == null) {
			btnCaricaProperty = new JButton("carica property...");
			btnCaricaProperty.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser jfc=new JFileChooser();
					jfc.showOpenDialog(btnCaricaProperty);
					File temp = jfc.getSelectedFile();

					if (temp!=null){
						System.out.println("file selezionato");
						System.out.println(temp.getAbsolutePath()); //imposto il path da passare al bulder
						pathProperty = temp.getAbsolutePath();
						getBtnValuta().setEnabled(true);
						
					}
				}
			});
			btnCaricaProperty.setBounds(223, 95, 201, 29);
		}
		return btnCaricaProperty;
	}
	
	
	private JRadioButton getRdbtnVisitaSimmetrica() {
		if (rdbtnVisitaSimmetrica == null) {
			rdbtnVisitaSimmetrica = new JRadioButton("Visita simmetrica",true);
			rdbtnVisitaSimmetrica.setBounds(33, 144, 141, 23);
			group.add(rdbtnVisitaSimmetrica);
			visitor = new SimmetricVisitor(); // il bottone di default viene selezionato quindi lo creo
			rdbtnVisitaSimmetrica.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					visitor = new SimmetricVisitor(); //setto il visitor quando viene effettuata un'azione
					System.out.println("sono simmetrico");
				}
			});//fine azione
			
		}//fine if
		return rdbtnVisitaSimmetrica;
	}//fine radioSimmetrica
	
	
	private JRadioButton getRdbtnVisitaPostfissa() {
		if (rdbtnVisitaPostfissa == null) {
			rdbtnVisitaPostfissa = new JRadioButton("Visita Postfissa");
			rdbtnVisitaPostfissa.setBounds(209, 144, 141, 23);
			group.add(rdbtnVisitaPostfissa);
			rdbtnVisitaPostfissa.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					visitor = new PostfixVisitor();
					System.out.println("sono postfisso");
					
				}
			}); //fine azione
		}//if
		return rdbtnVisitaPostfissa;
	}//fine radioPostfix
	private JTextPane getTxtpnRisultato() {
		if (txtpnRisultato == null) {
			txtpnRisultato = new JTextPane();
			txtpnRisultato.setBounds(33, 201, 574, 224);
			txtpnRisultato.setEditable(false);
		}
		return txtpnRisultato;
	}
}//classe
